package hashDemo;

import org.junit.Test;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @Author: Jie
 * @Date: 2018/12/26 18:00
 * @Function :使用Linkedhashmap 实现LRU 算法 详情见blog
 * 结构最多可以缓存6个元素，但元素多余六个时，会自动删除最近最久没有被使用的元素
 */
public class MLRU<K,V> extends LinkedHashMap<K, V> implements Map<K, V> {
    private static final long serialVersionUID = 1L;
    public MLRU(int initialCapacity,
               float loadFactor,
               boolean accessOrder) {
        super(initialCapacity, loadFactor, accessOrder);
    }
    /**
     * @description 重写LinkedHashMap中的removeEldestEntry方法，当LRU中元素多余6个时，
     *              删除最不经常使用的元素
     * @author rico
     * @created 2017年5月12日 上午11:32:51
     * @param eldest
     * @return
     * @see java.util.LinkedHashMap#removeEldestEntry(java.util.Map.Entry)
     */
    @Override
    protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
        // TODO 最多6个缓存
        if(size() > 6){
            return true;
        }
        return false;
    }



    @Test
    public void mainTest(String[] args) {
        MLRU<Character, Integer> lru = new MLRU<Character, Integer>(
                16, 0.75f, true);

        String s = "abcdefghijkl";
        for (int i = 0; i < s.length(); i++) {
            Integer put = lru.put(s.charAt(i), i);
        }
        System.out.println("LRU中key为h的Entry的值为： " + lru.get('h'));
        System.out.println("LRU的大小 ：" + lru.size());
        System.out.println("LRU ：" + lru);
    }

}
